// mod trait_learn; 并不需要别人来调用，所有都不用使用mod关键字了
/* 针对clone的学习与记录 */

#[derive(Debug)]
struct Foo1 {
    data: Vec<i32>,
}

impl Clone for Foo1 {
    fn clone(&self) -> Self {
        Foo1 {
            data: self.data.clone(),
        }
    }

    fn clone_from(&mut self, source: &Self) {
        self.data.clear(); // 清空原本的数据
        self.data.extend(source.data.iter().cloned());
        // 将被复制的source中内存复制到旧的vec内存中（此时就不用重新为vec分配内存了）
        // 但是，如果vec本身没有内存，还是需要分配内存的。
        // clone_from只是减少了内存分配的次数，已经分配的可以复用不需要重复分配
    }
}

// 使用派生宏
#[derive(Clone, Debug)]
struct Foo2 {
    data: Vec<i32>,
}

fn main() {
    let a = Foo1 {
        data: vec![1, 2, 3, 4],
    };
    let b = a.clone();
    println!("{:?}", a);
    println!("{:?}", b.data);
}
